#ifndef EXECUTOR_H
#define EXECUTOR_H

#include <vector>
#include <cstdint>
#include <stdexcept>
#include <memory>
#include <string>  // 新增：用于解析TR字符串指令

// 原有Pose结构体不变（符合实验1命名规范）
struct Pose {
    int32_t x;
    int32_t y;
    char heading;  // 直接存储'N/E/S/W'，简化类型转换
};

class Executor {
public:
    // 原有Heading枚举不变（符合实验1规范）
    enum class Heading {
        HEADING_NORTH = 'N',
        HEADING_EAST = 'E',
        HEADING_SOUTH = 'S',
        HEADING_WEST = 'W'
    };

    // 原有构造函数不变
    Executor();

    // 新增：支持字符串指令（核心：处理"TR"双字符指令）
    void ExecuteBatchCmds(const std::string& cmdStr);
    // 原有对外接口全部保留，不修改
    void Init(int32_t x, int32_t y, char headingChar);
    void ExecuteCmd(char cmd);
    void ExecuteBatchCmds(const std::vector<char>& cmds);
    Pose GetCurrentState() const;
    bool IsAccelerated() const;
    bool IsReversed() const;

private:
    // 原有成员变量不变（实验1小驼峰命名）
    int32_t currentX;
    int32_t currentY;
    Heading currentHeading;
    bool isAccelerated;
    bool isReversed;

    // 原有指令抽象基类（ICommand）不变（实验2多态核心）
    class ICommand {
    public:
        virtual ~ICommand() = default;  // 虚析构避免内存泄漏
        virtual void DoOperate(Executor& executor) const noexcept = 0;
    };

    // 原有指令子类（M/L/R/F/B）不变，新增TR指令子类
    class MoveCommand final : public ICommand {
    public:
        void DoOperate(Executor& executor) const noexcept override;
    };
    class TurnLeftCommand final : public ICommand {
    public:
        void DoOperate(Executor& executor) const noexcept override;
    };
    class TurnRightCommand final : public ICommand {
    public:
        void DoOperate(Executor& executor) const noexcept override;
    };
    class FastCommand final : public ICommand {
    public:
        void DoOperate(Executor& executor) const noexcept override;
    };
    class ReverseCommand final : public ICommand {
    public:
        void DoOperate(Executor& executor) const noexcept override;
    };
    // 新增：TR掉头指令类（需求4核心，继承ICommand符合接口规范）
    class TurnRoundCommand final : public ICommand {
    public:
        void DoOperate(Executor& executor) const noexcept override;
    };

    // 原有辅助函数不变（隐藏实现细节，符合实验1封装原则）
    Heading CharToHeading(char c);
    void TurnLeft();
    void TurnRight();
    void MoveForward(int steps);
    void MoveReverse(int steps);
    void ToggleAccelerated();
    void ToggleReversed();
    // 指令工厂函数扩展：新增TR指令映射（Z为内部标识）
    std::unique_ptr<ICommand> CreateCommand(char cmd);

    // 新增：辅助函数——解析字符串指令中的TR，转为内部单字符（Z）
    std::vector<char> ParseTRCommand(const std::string& cmdStr) const noexcept;
};

#endif // EXECUTOR_H